﻿using System;
using System.ComponentModel;

using RAD.LightOne.ComponentModel;

namespace RAD.LightOne.ComponentModel.Aspects
{
    #region Documentation
    ///<summary>
    /// Aspecto de utilização geral, é definido por padrão em <see cref="RAD.LightOne.MyObject"/> tornando a alteração em suas propriedades notificáveis.
    ///</summary>
    ///<seealso cref="System.ComponentModel.INotifyPropertyChanged"/>
    ///<remarks>
    ///Pode ser suprimido para uma determinada propriedade pela utilização do atributo <see cref="RAD.LightOne.ComponentModel.SuppressNotifyPropertyChangeAttribute"/>.
    /// </remarks>
    #endregion
   /* [Serializable]
   [MulticastAttributeUsage(MulticastTargets.Class, AllowMultiple = false)]
    public sealed class NotifyPropertyChangedAttribute : InstanceLevelAspect
    {
        #region Documentation
        ///<summary>
        /// Método pós-implementado pelo aspecto como disparador do evento <see cref="INotifyPropertyChanged.PropertyChanged"/>.
        ///</summary>
        #endregion
        [OnLocationSetValueAdvice]
        [MulticastPointcut(Targets = MulticastTargets.Property, Attributes = MulticastAttributes.Instance | MulticastAttributes.NonAbstract)]
        public void OnPropertySet( LocationInterceptionArgs args )
        {
            if ( args.Value == args.GetCurrentValue() ) return;

            args.ProceedSetValue();

            if (!SupressNotifyPropertyChangeAttribute.IsDefined(args.Location.PropertyInfo))
            {
                ((MyObject)args.Instance).CallPropertyChanged(args.Location.Name);
            }
        }
    }*/

    /*[Serializable]
    [MulticastAttributeUsage(MulticastTargets.Property, AllowMultiple = false, Inheritance = MulticastInheritance.Strict)]
    public sealed class NotifyPropertyChangedAttribute : LocationInterceptionAspect
    {
        public override void OnSetValue(LocationInterceptionArgs args)
        {
            if (args.Value == args.GetCurrentValue())
            {
                return;
            }

            args.ProceedSetValue();

            if (!SupressNotifyPropertyChangeAttribute.IsDefined(args.Location.PropertyInfo))
            {
                ((MyObject)args.Instance).CallPropertyChanged(args.Location.Name);
            }
        }
    }*/

}